package com.company.gjtx.common.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.company.gjtx.common.exception.BusinessException;
import com.company.gjtx.common.util.PageView;

public interface GenericManager<T, ID extends Serializable> {

	/**
	 * 检测传入的对象是否满足保存或更新的要求
	 * 
	 * @param entity：代检测的对象
	 * @return
	 */
	public boolean check(T entity) throws BusinessException;

	/**
	 * 保存或修改实体
	 * 
	 * @param entity :
	 *            需要保存或修改到数据库的实体
	 * @throws BusinessException
	 */
	public void saveOrUpdate(T entity) throws BusinessException;

	/**
	 * <p>
	 * 保存或修改实体
	 * </p>
	 * 
	 * @param entities :
	 *            需要保存或修改到数据库的实体集合
	 * @throws BusinessException
	 */
	public void saveOrUpdateAll(Collection<T> entities)
			throws BusinessException;

	/**
	 * 批量更新基本信息实体
	 * 
	 * @param idSet
	 * @param entity
	 * @throws BusinessException
	 */
	public void updateAllByHql(Set<Long> idSet, T entity, String pkStr)
			throws BusinessException;

	/**
	 * 保存实体
	 * 
	 * @param entity :
	 *            需要保存的实体
	 * @return 保存后得到的id
	 * @throws BusinessException
	 */
	public ID save(T entity) throws BusinessException;

	/**
	 * 检测传入的实体是否允许删除
	 * 
	 * @param entity :
	 *            待检测的实体
	 * @return 是否允许删除。true为允许删除；false为不允许删除
	 * @throws BusinessException
	 */
	public boolean removeCheck(T entity) throws BusinessException;

	/**
	 * <p>
	 * 删除实体
	 * </p>
	 * 
	 * @param entity :
	 *            需要删除的实体
	 * @throws BusinessException
	 */
	public void remove(T entity) throws BusinessException;

	/**
	 * <p>
	 * 删除实体集合
	 * </p>
	 * 
	 * @param entities :
	 *            需要删除的实体集合
	 * @throws BusinessException
	 * @throws BusinessException
	 */
	public void removeAll(Collection<T> entities) throws BusinessException;

	/**
	 * <p>
	 * 修改实体
	 * </p>
	 * 
	 * @param entity :
	 *            需要修改的实体
	 * @throws BusinessException
	 */
	public void modify(T entity) throws BusinessException;

	/**
	 * <p>
	 * 通过名字查找
	 * </p>
	 * 
	 * @param id :
	 *            id
	 * @return 找到的实体
	 * @throws BusinessException
	 */
	public T findById(ID id) throws BusinessException;

	/**
	 * 通过bean屬性查找
	 * 
	 * @param propertyName :
	 *            属性名称
	 * @param value :
	 *            属性值
	 * @return 找到的实体
	 * @throws BusinessException
	 */
	public List<T> findByProperty(String propertyName, Object value)
			throws BusinessException;

	/**
	 * 根据条件查询数据
	 * 
	 * @param Map
	 * @return List<T>
	 * @throws BusinessException
	 */
	public List<T> findByCondition(Map<String, Object> conditions)
			throws BusinessException;

	/**
	 * 查找全部实体
	 * 
	 * @return 所有实体的列表
	 * @throws BusinessException
	 */
	public List<T> findAll() throws BusinessException;

	/**
	 * <p>
	 * 根据给定的hql语句进行分页查找
	 * <p>
	 * 
	 * @param pageView
	 *            :分页条件对象
	 * @return 匹配的实体列表
	 * @throws BusinessException
	 */
	public PageView<T> findByPage(PageView<T> pageView)
			throws BusinessException;

	/**
	 * <p>
	 * 根据给定的条件，hql语句进行分页查找
	 * <p>
	 * 
	 * @param page :
	 *            要查询的页码
	 * @param size :
	 *            每页记录条数
	 * @return 匹配的实体列表
	 * @throws BusinessException
	 */
	public PageView<T> findByPage(Map<String, Object> conditions,
			PageView<T> pageView) throws BusinessException;

	/**
	 * <p>
	 * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录
	 * </p>
	 * 
	 * @return 记录总数
	 * @throws BusinessException
	 */
	public int getTotalRows() throws BusinessException;

	/**
	 * <p>
	 * 根据每页记录的数量,计算出总的分页数
	 * </p>
	 * 
	 * @param size
	 *            每页记录的数量
	 * @return 分页总数
	 * @throws s
	 * @throws BusinessException
	 */
	public int getPageSize(int size) throws BusinessException;

	/**
	 * 更具指定的条件进行分页查找
	 * 
	 * @param conditions
	 * @param pageView
	 * @param tableAndJoinConditions
	 *            Map<Class,String> Map<为需要连接的实体,连接条件 > 连接条件中，所有别名都使用全小写
	 *            tableAndJoinConditions使用LinkedHashMap 为了保持有序，方便读取
	 * @return
	 * @throws BusinessException
	 */
	public PageView<T> findByPage(Map<String, Object> conditions,
			PageView<T> pageView,
			LinkedHashMap<Class, String> tableAndJoinConditions,
			Map<Class, Map<String, Object>> exConditions)
			throws BusinessException;

	public void specialRemove(T entity) throws BusinessException;

}